package com.sino.business.service;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import com.sino.bean.Acl;
import com.sino.bean.TModule;
import com.sino.business.ITModuleService;
import com.sino.dao.IAclDAO;
import com.sino.dao.ITModuleDAO;
import com.sino.dao.hibernate.TModuleDAO;
import com.sino.model.ModuleModel;

public class TModuleServiceImp implements ITModuleService {
	public ITModuleDAO tmoduleDAO = null;

	private IAclDAO aclDAO;

	/**
	 * @param tmoduleDAO
	 *            the tmoduleDAO to set
	 */
	public void setTmoduleDAO(TModuleDAO tmoduleDAO) {
		this.tmoduleDAO = tmoduleDAO;
	}

	/**
	 * @param aclDAO
	 *            the aclDAO to set
	 */
	public void setAclDAO(IAclDAO aclDAO) {
		this.aclDAO = aclDAO;
	}

	// 保存模块
	public void saveTModule(ModuleModel moduleModel) {
		this.tmoduleDAO.saveTModule(this.getTModule(moduleModel));

	}

	// 更新模块
	public void updateModuleModel(ModuleModel moduleModel) {
		this.tmoduleDAO.updateTModule(this.getTModule(moduleModel));

	}

	// 删除子模块
	public boolean delChildrenTModule(int id) {
		List<Acl> aclList = this.aclDAO.listRoleByModule(id);
		if (null != aclList && aclList.size() > 0) {
			return false;
		}
		this.tmoduleDAO.delTModule(id);
		return true;
	}

	/**
	 * 删除一级模块 实现原理：判断该模块是否有子模块 如果存在子模块，则先删除子模块，然后删除父模块 如果不存在子模块，则直接删除该模块
	 */
	@SuppressWarnings("unchecked")
	public boolean delParentTModule(int id) {
		Set<TModule> s = (Set<TModule>) this.tmoduleDAO.getTModule(id)
				.getTModules();
		boolean delCM = true;
		if (!s.isEmpty()) {
			for (TModule tm : s) {
				delCM = this.delChildrenTModule(tm.getId());
				if (false == delCM) {
					return false;
				}
			}
		}
		return (this.delChildrenTModule(id));
	}

	/**
	 * 查找hqlwhere的记录数
	 */
	public int findModulePageCount(String hqlwhere) {
		String hql = "select count(*) from TModule as t";
		if (!"".equals(hqlwhere)) {
			hql = hql + " where " + hqlwhere;
		}
		return this.tmoduleDAO.findPageCount(hql);
	}

	// 通过hqlwhere分页查找
	public List findModulePageList(int firstRow, int maxRow, String hqlwhere) {
		String hql = "from TModule as t";
		if (!"".equals(hqlwhere)) {
			hql = hql + " where " + hqlwhere;
		}
		hql = hql + " order by t.orderNum";
		List<ModuleModel> ls = new ArrayList<ModuleModel>();
		List<TModule> list = this.tmoduleDAO.findModulePageList(firstRow,
				maxRow, hql);
		for (TModule tm : list) {
			ModuleModel mm = this.getModuleModel(tm);
			ls.add(mm);
		}
		return ls;
	}

	// 将ModuleModel转化为TModule
	private TModule getTModule(ModuleModel moduleModel) {
		TModule tmodule = new TModule();
		tmodule.setId(moduleModel.getId());
		tmodule.setName(moduleModel.getName());
		tmodule.setOrderNum(moduleModel.getOrderNum());
		tmodule.setSn(moduleModel.getSn());
		tmodule.setTModule(moduleModel.getTModule());
		tmodule.setTModules(moduleModel.getTModules());
		tmodule.setUrl(moduleModel.getUrl());
		return tmodule;
	}

	// 将TModule转化为ModuleModel
	private ModuleModel getModuleModel(TModule tmodule) {
		ModuleModel moduleModel = new ModuleModel();
		moduleModel.setId(tmodule.getId());
		moduleModel.setName(tmodule.getName());
		moduleModel.setOrderNum(tmodule.getOrderNum());
		moduleModel.setSn(tmodule.getSn());
		moduleModel.setTModule(tmodule.getTModule());
		moduleModel.setTModules(tmodule.getTModules());
		moduleModel.setUrl(tmodule.getUrl());
		return moduleModel;
	}
}
